package com.fdb.efp.nls.service.impl.bd;

import com.fdb.basic.framework.core.constant.CertTypeConstant;
import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.basic.framework.core.util.StringUtil;
import com.fdb.efp.nls.service.facade.bd.BdDnDetailBatchService;
import com.fdb.efp.nls.service.util.DueDataUtil;
import com.fdb.efp.nls.service.facade.AccLoanService;
import com.fdb.efp.nls.service.facade.AccoutErroTempService;
import com.fdb.efp.nls.service.facade.BdAccLoanTempService;
import com.fdb.efp.nls.service.facade.BdDnDetailTempService;
import com.fdb.efp.nls.service.vo.AccoutErroTempVO;
import com.fdb.efp.nls.service.vo.BdAccLoanTempVO;
import com.fdb.efp.nls.service.vo.BdDnDetailTempVO;
import com.fdb.efp.nls.service.facade.BdLoanpayService;
import com.fdb.efp.nls.service.facade.NlsApplyInfoService;
import com.fdb.efp.nls.service.vo.BdLoanpayVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 
 * 根据百度同步过来的百度放款明细文件信息临时表数据修改放款明细表
 * 
 * @author ludayong
 * @since 2019年3月7日 下午3:18:50
 * @version 1.0
 */
@Service("bdDnDetailBatchService")
public class BdDnDetailBatchServiceImpl implements BdDnDetailBatchService {

	private static Logger logger = LoggerFactory.getLogger(BdDnDetailBatchServiceImpl.class);

	@Autowired
	@Qualifier("accLoanService")
	private AccLoanService accLoanService;// 借据信息

	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 错误信息

	@Autowired
	@Qualifier("bdDnDetailTempService")
	private BdDnDetailTempService bdDnDetailTempService;// 放款明细临时信息

	@Autowired
	@Qualifier("bdLoanpayService")
	private BdLoanpayService bdLoanpayService;// 百度放款通知记录信息

	@Autowired
	@Qualifier("nlsApplyInfoService")
	private NlsApplyInfoService nlsApplyInfoService;// 网贷申请信息

	@Autowired
	@Qualifier("bdAccLoanTempService")
	private BdAccLoanTempService bdAccLoanTempService;// 百度借据信息临时信息

	/**
	 * 
	 * 根据百度同步过来的百度放款明细文件信息临时表数据修改放款明细表 <br>
	 * 0.1:ludayong:2019年3月7日 下午3:17:41:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月7日 下午3:17:41
	 * @date 2019年3月7日 下午3:17:41
	 * @version 0.1
	 */
	@Override
	public boolean batchUpdateDnDetail() throws Exception {
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步百度放款明细临时数据到百度放款通知记录信息表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
		// 可以配置参数
		Integer pageSize = 1000;
		try {
			// 分页信息
			BdDnDetailTempVO pageInfo = new BdDnDetailTempVO();
			// 新增或者修改的百度放款明细信息数量
			int num = 0;
			// 新增或者修改
			//int insertOrUpdateNum = 0;
			// 页数
			int page = 1;
			// pageSize初始化
			if (pageSize > 0) {
				pageInfo.setSize(pageSize);
			} else {
				pageInfo.setSize(1000);
			}
			// 判断循环次数
			int size = bdDnDetailTempService.queryCount();
			String size_msg = "【放款明细临时表】数据量：" + size;
			logger.info(size_msg, "message{}");
			int loopCount = (size / pageInfo.getSize()) + 1;
			// 网贷申请基本信息
			// NlsApplyInfoVO inNlsApplyInfoVO = new NlsApplyInfoVO();
			// 百度订单号
			// String orderId = null;
			for (int i = 0; i < loopCount; i++) {
				String page_msg = "【放款明细临时表】当前页数：" + pageInfo.getPage() + "，分页大小：" + pageInfo.getSize();
				logger.info(page_msg, "message{}");
				// 需要新增或者修改的 放款申请信息
				List<BdLoanpayVO> list = new ArrayList<BdLoanpayVO>();
				// 分页查询【放款明细临时表】数据
				List<BdDnDetailTempVO> tempList = bdDnDetailTempService.queryByPage(pageInfo);
				if (Objects.nonNull(tempList) && !tempList.isEmpty()) {
					for (BdDnDetailTempVO bdDnDetailTempVO : tempList) {
						// orderId = bdDnDetailTempVO.getOrderId();
						// 网贷用信申请流水号
						// String applySeq = "";
						// 订单号非空
						// if (!StringUtil.isNullorBank(orderId)) {
						// // 订单号
						// inNlsApplyInfoVO.setBdOrderId(orderId);
						// // 查询的网贷申请基本信息
						// NlsApplyInfoVO queryNlsApplyInfoVO =
						// nlsApplyInfoService.queryByPk(inNlsApplyInfoVO);
						// if (Objects.nonNull(queryNlsApplyInfoVO)) {
						// // 网贷用信申请流水号
						// applySeq = queryNlsApplyInfoVO.getApplySeq();
						// } else {
						// String tableName = "nls_apply_info";
						// String errorMsg = "未查询到放款明细信息关联的网贷申请基本信息，放款订单号：" + orderId;
						// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
						// errorMsg);
						// logger.error(errorMsg);
						// }
						// }
						// 网贷用信申请流水号非空
						// if (!StringUtil.isNullorBank(applySeq)) {
						// 1.1根据放款明细临时信息的百度订单号查询百度放款通知记录信息表信息是否存在，存在进行修改，不存在新增
						BdLoanpayVO bdLoanpayVO = initBdLoanpayVO(bdDnDetailTempVO);
						if (Objects.nonNull(bdLoanpayVO)) {
							list.add(bdLoanpayVO);
						}
						// }
					}
					if (list != null && !list.isEmpty()) {
						num += bdLoanpayService.insertOrUpdateBdLoanpay(list);
					}
				}
				pageInfo.setPage(++page);
			}
			String num_msg = "【放款明细表】插入或更新数据处理结果:" + num;
			logger.info(num_msg, "message{}");
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_loanpay";
			String errorMsg = "同步百度放款明细临时数据到百度放款通知记录信息表出错";
			String remark = "同步百度放款明细临时数据到百度放款通知记录信息表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步百度放款明细临时数据到百度放款通知记录信息表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
		logger.info("同步百度放款明细临时数据到百度放款通知记录信息表，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 根据放款明细临时信息初始化百度放款通知记录信息 <br>
	 * 0.1:ludayong:2019年3月11日 下午9:10:21:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月20日 下午9:10:21
	 * @date 2019年3月20日 下午9:10:21
	 * @version 0.1
	 */
	public BdLoanpayVO initBdLoanpayVO(BdDnDetailTempVO bdDnDetailTempVO) {
		// 百度放款通知记录信息
		BdLoanpayVO newBdLoanpayVO = new BdLoanpayVO();
		// 借据信息
		BdAccLoanTempVO inBdAccLoanTempVo = new BdAccLoanTempVO();
		// 借据号
		inBdAccLoanTempVo.setLoanId(bdDnDetailTempVO.getLoanId());
		BdAccLoanTempVO queryBdAccLoanTempVO = bdAccLoanTempService.queryByPk(inBdAccLoanTempVo);
		// 还款日
		String dueDay = "";
		if (Objects.nonNull(queryBdAccLoanTempVO)) {
			dueDay = queryBdAccLoanTempVO.getRepayDay() == null ? "" : queryBdAccLoanTempVO.getRepayDay().toString();
		}
		// 创建人或修改人
		final String createUser = "admin";
		// 贷款币种
		final String loanCyy = "CNY";
		// apply_seq 申请流水号 seq_no
		// 机构放款交易流水:机构（银行）划拨转账单号，核心未收到前置空，机构应保证百度方在银行可通过该流水号查询到该笔交易。
		newBdLoanpayVO.setApplySeq(bdDnDetailTempVO.getSeqNo());
		// cus_name 客户名称 cust_name 客户姓名:客户姓名,汉字之间没有间隔
		newBdLoanpayVO.setCusName(bdDnDetailTempVO.getCustName());
		// 还款日
		newBdLoanpayVO.setDueDay(dueDay);
		// loan_ccy 贷款币种 currency 币种:156--人民币
		newBdLoanpayVO.setLoanCcy(loanCyy);
		// cont_start_date 合同开始日期 start_Date 确认日期
		newBdLoanpayVO.setContStartDate(DueDataUtil.dateInfoTrans(bdDnDetailTempVO.getStartDate()));
		// cont_end_date 到期日 end_date 到期日期:贷款到期日期，最后一期结束日期
		newBdLoanpayVO.setContEndDate(DueDataUtil.dateInfoTrans(bdDnDetailTempVO.getEndDate()));
		// dn_sts 放款状态 fund_status 放款状态:1--放款中；2--已放款；3--已冲正；4--已撤销
		newBdLoanpayVO.setDnSts(dnStsTrans(bdDnDetailTempVO.getFundStatus()));
		// event_type 事件码 fail_type
		// 放款失败类型:对应“放款状态”为3、4，该字段才有值。1--机构转账失败：外部机构将放款资金转账至钱包备付金账户失败或一定时间内未收到外部机构转账结果或无法查询到外部机构转账结果。2--百付宝钱包充值失败：外部机构转账成功，钱包百付宝充值失败。3--放款失败：钱包充值成功，钱包放款失败。4--出资机构放款失败：外部机构放款模式业务后台通知外部出资机构放款，外部出资机构放款失败。
		newBdLoanpayVO.setEventType(bdDnDetailTempVO.getFailType());
		// order_id 业务订单号 order_id
		newBdLoanpayVO.setOrderId(bdDnDetailTempVO.getOrderId());
		// cur_date 账务日期 cur_date 账务日期:对账日期（T日）
		newBdLoanpayVO.setCurDate(DueDataUtil.dateInfoTrans(bdDnDetailTempVO.getCurDate()));
		// leader 牵头方 leader 牵头方:BAIDU--百度
		newBdLoanpayVO.setLeader(bdDnDetailTempVO.getLeader());
		// partner 合作方 parter 合作方
		newBdLoanpayVO.setPartner(bdDnDetailTempVO.getParter());
		// cert_type 证件类型 cert_type 证件类型:01--身份证
		newBdLoanpayVO.setCertType(CertTypeConstant.CODE_10100);
		// cert_no 证件号 cert_no 证件号:证件号码
		newBdLoanpayVO.setCertNo(bdDnDetailTempVO.getCertNo());
		// loan_id 借据号 loan_id 借据号:借据号
		newBdLoanpayVO.setLoanId(bdDnDetailTempVO.getLoanId());
		// apply_date 申请日期 apply_date 申请日期:贷款申请日期
		newBdLoanpayVO.setApplyDate(DueDataUtil.dateInfoTrans(bdDnDetailTempVO.getApplyDate()));
		// start_date 确认日期 start_date 确认日期:贷款确认日期, 未确认前为空
		newBdLoanpayVO.setStartDate(DueDataUtil.dateInfoTrans(bdDnDetailTempVO.getStartDate()));
		// repay_mode 还款方式 repay_mode 还款方式
		newBdLoanpayVO.setRepayMode(repayModeTrans(bdDnDetailTempVO.getRepayMode()));
		// repay_cycle 还款周期 repay_cycle 还款周期:M--月
		newBdLoanpayVO.setRepayCycle(bdDnDetailTempVO.getRepayCycle());
		// total_terms 总期数 total_terms 总期数:贷款总期数
		newBdLoanpayVO.setTotalTerms(bdDnDetailTempVO.getTotalTerms().toString());
		// grace_day 宽限期 grace_day 宽限期:本金宽限期天数，单位：天
		newBdLoanpayVO.setGraceDay(bdDnDetailTempVO.getGraceDay().toString());
		// encash_amt 机构金额 encash_amt 借据金额:放款金额（单位：分）
		newBdLoanpayVO.setEncashAmt(DueDataUtil.checkDecimalInfo(bdDnDetailTempVO.getEncashAmt(), 100));
		// create_user 创建人
		newBdLoanpayVO.setCreateUser(createUser);
		// create_time 创建时间
		newBdLoanpayVO.setCreateTime(DateTool.getCurrentDateTime());
		// last_update_user 最后更新人
		newBdLoanpayVO.setLastModifyUser(createUser);
		// last_update_time 最后更新时间
		newBdLoanpayVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 放款失败类型
		newBdLoanpayVO.setFailType(bdDnDetailTempVO.getFailType());
		// 银行卡号
		newBdLoanpayVO.setCardNo(bdDnDetailTempVO.getCardNo());
		return newBdLoanpayVO;
	}

	/**
	 * 
	 * 还款方式转换<br>
	 * 0.1:ludayong:2019年3月20日 下午7:05:11:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月20日 下午7:05:11
	 * @date 2019年3月20日 下午7:05:11
	 * @version 0.1
	 */
	private String repayModeTrans(String repayMode) {
		if (StringUtil.isNullorBank(repayMode)) {// 还款方式为空
			return "";
		}
		// 101 只还利息，到期还本
		// 102 等额本息
		// 201 等额本金
		// 202 协议还款
		// FB99 其他

		// 01：等额本金
		// 02：等额本息
		// 03：等本等费
		// 04：先息后本
		// 新的还款方式
		String newRepayMode = "";
		switch (repayMode) {
		case "01":
			newRepayMode = "201";
			break;
		case "02":
			newRepayMode = "102";
			break;
		case "04":
			newRepayMode = "101";
			break;
		default:
			newRepayMode = "FB99";
		}
		return newRepayMode;
	}

	/**
	 * 
	 * 放款状态转换<br>
	 * 0.1:ludayong:2019年3月20日 下午7:05:11:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月20日 下午7:05:11
	 * @date 2019年3月20日 下午7:05:11
	 * @version 0.1
	 */
	private String dnStsTrans(String dnSts) {
		if (StringUtil.isNullorBank(dnSts)) {// 放款状态为空
			return "";
		}
		// 0 放款失败
		// 1 联合放款成功
		// 2 全额放款
		// 3 待放款

		// 1 放款中
		// 2 已放款
		// 3 已冲正
		// 4 已撤销
		// 新的放款状态
		String newDnSts = "";
		switch (dnSts) {
		case "1":
			newDnSts = "3";
			break;
		case "2":
			newDnSts = "1";
			break;
		case "3":
			newDnSts = "4";
			break;
		case "4":
			newDnSts = "5";
			break;
		default:
			newDnSts = "";
		}
		return newDnSts;
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午8:40:46:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午8:40:46
	 * @date 2019年3月8日 上午8:40:46
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
